package com.micro.train.service.impl;

import com.micro.train.entity.Train;
import com.micro.train.entity.Station;
import com.micro.train.service.PriceCalculationService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

/**
 * 火车票价计算服务实现类（简化版）
 */
@Service
public class PriceCalculationServiceImpl implements PriceCalculationService {
    
    // 基础票价配置（车次 + 座位类型 -> 价格）
    private static final Map<String, BigDecimal> BASE_PRICES = new HashMap<>();
    
    static {
        // G1列车（北京-上海）
        BASE_PRICES.put("G1_1", new BigDecimal("650.00")); // 一等座
        BASE_PRICES.put("G1_2", new BigDecimal("553.50")); // 二等座
        BASE_PRICES.put("G1_3", new BigDecimal("1200.00")); // 商务座
        
        // G2列车（上海-北京）
        BASE_PRICES.put("G2_1", new BigDecimal("650.00")); // 一等座
        BASE_PRICES.put("G2_2", new BigDecimal("553.50")); // 二等座
        BASE_PRICES.put("G2_3", new BigDecimal("1200.00")); // 商务座
        
        // D1列车（北京-广州）
        BASE_PRICES.put("D1_1", new BigDecimal("800.00")); // 一等座
        BASE_PRICES.put("D1_2", new BigDecimal("680.00")); // 二等座
        BASE_PRICES.put("D1_3", new BigDecimal("1500.00")); // 商务座
        
        // K1列车（北京-深圳）
        BASE_PRICES.put("K1_1", new BigDecimal("900.00")); // 一等座
        BASE_PRICES.put("K1_2", new BigDecimal("750.00")); // 二等座
        BASE_PRICES.put("K1_3", new BigDecimal("1800.00")); // 商务座
    }
    
    @Override
    public BigDecimal calculateBasePrice(Train train, Station departureStation, Station terminalStation, Integer seatType) {
        // 生成价格键：车次_座位类型
        String priceKey = train.getTrainNumber() + "_" + seatType;
        
        // 获取基础票价
        BigDecimal basePrice = BASE_PRICES.get(priceKey);
        
        // 如果没有配置，使用默认价格
        if (basePrice == null) {
            basePrice = getDefaultPrice(train.getTrainType(), seatType);
        }
        
        return basePrice.setScale(2, RoundingMode.HALF_UP);
    }
    
    @Override
    public BigDecimal calculateDynamicPrice(BigDecimal basePrice, LocalDate travelDate, Integer seatType, 
                                          Integer availableSeats, Integer totalSeats) {
        // 简化版：直接返回基础票价，不做动态调整
        return basePrice;
    }
    
    @Override
    public BigDecimal getSeatTypePriceFactor(Integer seatType) {
        // 简化版：不再使用价格系数
        return BigDecimal.ONE;
    }
    
    /**
     * 获取默认价格（根据列车类型和座位类型）
     */
    private BigDecimal getDefaultPrice(String trainType, Integer seatType) {
        // 根据列车类型设置基础价格
        BigDecimal basePrice;
        switch (trainType) {
            case "G": // 高铁
                basePrice = new BigDecimal("500.00");
                break;
            case "D": // 动车
                basePrice = new BigDecimal("400.00");
                break;
            case "K": // 快速
                basePrice = new BigDecimal("300.00");
                break;
            default:
                basePrice = new BigDecimal("200.00");
        }
        
        // 根据座位类型调整价格
        switch (seatType) {
            case 1: // 一等座
                return basePrice.multiply(new BigDecimal("1.2"));
            case 2: // 二等座
                return basePrice;
            case 3: // 商务座
                return basePrice.multiply(new BigDecimal("2.0"));
            case 4: // 软卧
                return basePrice.multiply(new BigDecimal("1.5"));
            case 5: // 硬卧
                return basePrice.multiply(new BigDecimal("1.3"));
            case 6: // 硬座
                return basePrice.multiply(new BigDecimal("0.8"));
            default:
                return basePrice;
        }
    }
}
